package com.grgbanking.it.base;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * BaseDAO 定义DAO的通用操作
 * 
 * @author JRainbow 
 */
public interface IBaseDao<T ,PK extends Serializable> {
	/**  
     * 保存指定实体类  
     *   
     * @param entity 
     *            实体类  
     */  
	public void save(T entity);

	/**  
     * 更新或保存指定实体  
     *   
     * @param entity 实体类  
     */  
	public void update(T entity);
	
	/**  
     * 保存或更新指定实体类  
     *   
     * @param entity
     *            实体类  
     */  
	public void saveOrUpdate(T entity);
	/**
	 * 根据List保存
	 * 
	 * @param list
	 *            对象列表
	 */
	public void save(List<T> list) throws Exception ;
	/**
	 * 增加或更新集合中的全部实体
	 * 
	 * @param entities
	 *            对象集合
	 */
	public void saveOrUpdateAll(Collection<T> entities) throws Exception ;
	/**  
     * 删除指定实体  
     *   
     * @param entity
     *            实体类  
     */ 
	public void delete(T entity);
	/**
	 * 虚拟删除
	 * 状态更新为0
	 * virtualDelete
	 * 
	 * @param id
	 * @throws Exception 
	 * @exception 
	 * @since  1.0.0
	 */
	public void virtualDelete(PK id)throws Exception ;
	
	/** 
     * 根据id删除一条记录 
     * @param id  
     *            ID 
     */ 
	public void deleteById(PK id);

	/**  
     * 查找指定ID实体类对象  
     *   
     * @param clazz  
     *            实体Class  
     * @param id  
     *            实体ID  
     * @return 实体对象  
     */  
	public T findById(PK id);
	
	/**
	 * 根据HQL获取一个数据
	 * @param hql
	 * @return
	 */
	public T findOneByHQL(String hql);
	
	 /** 
     * 根据Hql语句查询记录数量
     * 
     * @param hql  
     *            hql
     * @return 
     */  
	public Long getTotalByHQL(String hql);
	

	 /** 
     * 根据Hql语句查询多条记录对象 
     * 
     * @param hql  
     *            hql
     * @return 
     */  
	public List<T> findByHql(String hql);
	
	

	 /**  
     * 查询指定HQL语句的分页数据集合  
     *   
     * @param hql  
     *            HQL语句  
     * @param start  
     *            开始记录号  
     * @param limit  
     *            最大记录号  
     * @return 分页数据集合  
     */ 
	public List<T> pageByHQL(final String hql, final Integer start,final Integer limit);
	/**
	 * 使用HQL语句直接增加、更新、删除实体(不支持级联)
	 * 
	 * @param hql
	 * @return 操作成功的记录条数
	 */
	public int executeHQL(String hql) throws Exception;
	
	/**
	 * sql查询列表，自动转成Map
	 * @param sql
	 * @return
	 * @throws Exception
	 */
	public List<Map> listBySQL(String sql) throws Exception;
	/**
	 * 根据SQL获取实体对象集合
	 * findBySQL
	 * 
	 * @param sql  select的参数必须与实体类的属性一致
	 * @return
	 * @throws Exception 
	 * @exception 
	 * @since  1.0.0
	 */
	public List<T> findBySQL(String sql) throws Exception;
	/**
	 * 查询指定SQL语句的分页数据集合  
	 * pageBySQL
	 * 
	 * @param sql
	 * @param start
	 * @param limit
	 * @return 
	 * @exception 
	 * @since  1.0.0
	 */
	public List<?> pageBySQL(String sql, Integer start, Integer limit) ;
	 /** 
     * 根据SQL语句查询记录数量
     * 
     * @param hql  
     *            hql
     * @return 
     */ 
	public Long getTotalBySQL(String sql);
}
